package com.atguigu.rabbitmq.three;
import com.atguigu.rabbitmq.util.RabbitMqUtils;
import com.atguigu.rabbitmq.util.SleepUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Work04 {

    //队列名称
    public static final String TASK_QUEUE_NAME = "ack_queue";


    public static void main(String[] args) throws IOException, TimeoutException {

        Channel channel = RabbitMqUtils.getChanner();
        System.out.println("C2等待接收消息处理时间较长");

        DeliverCallback deliverCallback = (consumerTag, message) -> {

            SleepUtils.sleep(30);
            System.out.println("接收到的消息" + new String(message.getBody(), "UTF-8"));

            //手动应答
            /*
             * 参数1:消息的标记 tag
             * 参数2:是否批量应答(不应该批量应答,因为批量应答会出现消息丢失,所以选false,而true:批量)
             */
            channel.basicAck(message.getEnvelope().getDeliveryTag(), false);

        };
        //设置不公平的分发
        /*
         * 不公平分发
         *
         * 在最开始的时候我们学习RabbitMQ分发消息采用的轮询分发,
         * 但是在某种场景下这种策略并不是很好,比方说有两个消费者在处理任务,
         * 其中有个消费者1处理任务的速度非常快,而另外一个消费者2处理速度却很慢，
         * 这个时候我们还是采用轮训分发的话就会导致处理速度快的这个消费者会很大
         * 一部分时间处于空闲状态,而处理慢的那个消费者一直在干活,这种分配方式在
         * 这种情况下其实就不太友好,但是RabbitMQ并不知道这种情况它依然很公平的进行分发。
         *
         */
        //默认值是0,因为int类型的默认值就是0,不公平分发,改成1,公平分发
//        int prefetchCount = 1;
        //如果设置为不等于1也不能于0的值就是指定预取值
        int prefetchCount = 5;
        channel.basicQos(prefetchCount);

        //采用手动应答
        boolean autoAck = false;
        channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, (consumerTag -> {
            System.out.println(consumerTag + "消费者取消消费接口回调逻辑");
        }));

    }

}